package com.ruoyi.web.controller.pay;

import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayConfig;
import com.alipay.api.internal.util.AlipaySignature;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.share.config.TGPSecretkey;
import com.ruoyi.share.service.AliPayTGPService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.function.ServerResponse;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * @author
 * @version 1.0.0
 * @ClassName APITGPController
 * @createTime 2021年11月17日14:09:00
 **/

@RestController
@RequestMapping("/TGP")
public class APITGPController {

    @Autowired
    private AliPayTGPService aliPayTGPService;
    /**
     * 支付宝 支付接口
     *  2021年11月17日14:45:55
     *  nlx 654008850@qq.com
     * @param jsonObject
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    @PostMapping("/toPayment")
    public Map toPayment(@RequestBody JSONObject jsonObject, HttpServletResponse response) throws ServletException, IOException {
        return aliPayTGPService.toPayment(jsonObject,response);
    }

    /**
     * 支付宝异步通知
     * @param request
     * @return
     */
    @PostMapping("/PaymentRES")
    public String PaymentRES(HttpServletRequest request) {
        TGPSecretkey tgpSecretkey = new TGPSecretkey();// 支付宝配置
        Map<String,String> params = new HashMap<>();
        //getParameterMap()一般多用于接收前台表单多参数传输的数据
        //支付宝的回调都是把信息放到request里面
        Map requestParams = request.getParameterMap();
        //keyset()是获取所有的key值，iterator()是迭代遍历
        for(Iterator iter = requestParams.keySet().iterator(); iter.hasNext();){
            String name = (String)iter.next();
            //这里把key放到数组里面
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            //这个for循环的尊用就是把上面那个String中的值都遍历一遍
             for(int i = 0 ; i <values.length;i++){
                     //这个是三元运算符
                   valueStr = (i == values.length -1)?valueStr + values[i]:valueStr + values[i]+",";
                }
            //把数据全部加进map集合中   name就是key  valueStr就是value
             params.put(name,valueStr);
        }
        //sign就是签名    trade_status是交易的状态
        System.err.println("支付宝回调,sign:"+params.get("sign")+"  ,trade_status:}"+params.get("trade_status")+"    ,参数:{"+params.toString());

        //非常重要,验证回调的正确性,是不是支付宝发的.并且呢还要避免重复通知.
        //这个非常重要，但是不知道这个是什么意思
        //这个是签名类型 sign参数已经帮我们删除掉了，在这里我们要把签名类型删除掉
         params.remove("sign_type");
        try {
            //这里是RSA验证签名
            // tgpSecretkey.ALIPAY_PUBLIC_KEY 其实就是支付宝的应用公钥（记住不是支付宝的公钥，是支付宝应用公钥）
            //tgpSecretkey.signType也就是支付宝文本类型里面的签名类型：RSA2
            boolean alipayRSACheckedV2 = AlipaySignature.rsaCheckV2(params, tgpSecretkey.ALIPAY_PUBLIC_KEY,"utf-8",tgpSecretkey.signType);
            //如果验证上面的boolean为true的话，我们就应该更改下订单的状态，减少下库存这些操作
            if(!alipayRSACheckedV2){
                //return ServerResponse.createByErrorMessage("非法请求,验证不通过,再恶意请求我就报警找网警了");
                System.err.println("非法请求,验证不通过,再恶意请求我就报警找网警了");
                return "error";
             }
        } catch (AlipayApiException e) {
                System.err.println("支付宝验证回调异常:"+e);
            return "error";
        }

//        String res=
//        if(res.equals("success")){
//            return res;
//        }
        return aliPayTGPService.PaymentRES(params);
    }

    /**
     * 支付宝订单查询
     *  2021年11月17日14:45:55
     *  nlx 654008850@qq.com
     * @throws ServletException
     * @throws IOException
     */
    @PostMapping("/doPost")
    public void doPost(@RequestBody JSONObject params) throws Exception {
        aliPayTGPService.doPost(params);
    }
}
